package com.raymond.client.handler;

import com.raymond.client.msg.BaseMessage;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用策略模式来处理(待定)
 * 业务处理分发器
 *   1.好处是不需要每个业务在pipeline添加一个handler
 *   2.一些业务处理可以统一封装
 *
 * @author :  raymond
 * @version :  V1.0
 * @date :  2021-07-17 15:32
 */
public abstract class BaseHandler<I extends BaseMessage> {
    /**
     * 消息处理
     * @param ctx ctx
     * @param msg msg
     * @throws Exception 抛出来的异常
     */
    protected abstract void channelRead(ChannelHandlerContext ctx, I msg) throws Exception;

    protected List<byte[]> getBatchBytes(byte[] body) {
        List<byte[]> bytes = new ArrayList<>();
        ByteBuf byteBuf = Unpooled.wrappedBuffer(body);
        for(;;) {
            int length = byteBuf.readInt();
            byte[] data = new byte[length];
            byteBuf.readBytes(data);
            bytes.add(data);
            if (!byteBuf.isReadable()) {
                return bytes;
            }
        }
    }

}
